﻿#include <iostream>
#include <assert.h>
#include <vector>
#define OPEN 0
#define int long long 
using namespace std;

vector<int> arrmv;
vector<int> cnt, max_c;

void merge_sort(int pos, int sz) {
	if (sz == 0) return; // 递归的终点
	int nsz = (1 << (sz - 1));    // 区间从中间切开
	int m = pos + nsz;             // 另一边merge sort的起点
	merge_sort(pos, sz - 1);
	merge_sort(m, sz - 1);
	vector<int> tmp((1 << sz), 0);  // 暂存merge sort结果
	int l1 = 0, l2 = 0;
	int tpoi = 0;
	while (l1 < nsz && l2 < nsz) {
		if (arrmv[pos + l1] <= arrmv[m + l2])
			tmp[tpoi++] = arrmv[pos + l1], l1++;
		else 
			tmp[tpoi++] = arrmv[m + l2], cnt[sz] += m - (l1 + pos), l2++;  //cnt[sz]表示2^sz 下的逆序
		// 对有多少个.
	}

	while (l1 < nsz)
	{
		tmp[tpoi++] = arrmv[pos + l1];
		l1++;
	}
	while (l2 < nsz) {
		tmp[tpoi++] = arrmv[m + l2];
		l2++;
	}
	// 完成tmp的填充

	l1 = 0; l2 = 0;
	while (l1 < nsz && l2 < nsz) {
		if (arrmv[pos + l1] < arrmv[m + l2])l1++;
		else if (arrmv[pos + l1] > arrmv[m + l2])l2++;
		else {
			int cnt1 = 0, cnt2 = 0;
			while (l1 < nsz && arrmv[pos + l1] == arrmv[m + l2])
				cnt1++, l1++;
			while (l2 < nsz && arrmv[pos + l1 - 1] == arrmv[m + l2])
				cnt2++, l2++;
			max_c[sz] -= cnt1 * cnt2;     // 我们找到了左右区间分别有cnt1,cnt2个相同的数，它们
			// 在反转区间并不会产生影响，在这里我们需要减掉.那么max_c[sz]剩下的对数分别表示顺序对和
			// 逆序对的个数.
		}
	}
	for (int i = 0; i < tmp.size(); i++)
		arrmv[pos + i] = tmp[i];  // 排序结果需要整合给上一层使用
}

// 逆序对，一个数组，如果一个数字的右侧，存在比它小的数字，则这两个数字构成一个逆序对
// 比如，[3, 2, 4, 7, 1]
// 对于3，有 3 -> 2, 3 -> 1
// 对于2，有 2 -> 1
// 对于4，有 4 -> 1
// 对于7，有 7 -> 1
int32_t main_ReversePair() {
#if OPEN 
	freopen("vsin.txt", "r", stdin);
#endif
	int N = sizeof(int);
	cout << N << endl;

	int n; cin >> n;
	int tot = 1 << n;
	arrmv.assign(tot, 0);
	cnt.assign(n + 1, 0);
	max_c.assign(n + 1, 0);

	for (int i = 0; i < tot; i++) {
		cin >> arrmv[i];
	}
	for (int i = 1; i <= n; i++)
		max_c[i] = 1ll << (n + i - 2ll);    // 2^i下的总共对数
	// 包含顺序对，逆序对以及两两相等对.
	// 注意移位时候的1ll表示long long 型
	merge_sort(0, n);
	int nu; cin >> nu;
	for (int ii = 0; ii < nu; ii++) {
		int sz; cin >> sz;
		int sum = 0;
		for (int i = 1; i <= n; i++) {
			if (i <= sz)
				cnt[i] = max_c[i] - cnt[i]; // 受影响的区间需要把顺序对和逆序对 对调
			sum += cnt[i];
		}
		assert(sum >= 0);
		cout << sum << endl;
	}
	return 0;
}